package edu.mis.modules.user;

import java.lang.reflect.Method;
import java.util.Set;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Record;

import edu.mis.core.annotation.Permission;
import edu.mis.model.Resource;
import edu.mis.model.Role;
import edu.mis.model.User;


/**
 * 全局权限拦截<br>
 * 判断用户是否登录，没登录则进行拦截。
 */
public class LoginInterceptor implements Interceptor{
	@SuppressWarnings("all")
	public void intercept(Invocation invocation){
		boolean flag=false;
		Controller c=invocation.getController();	
		Method method=invocation.getMethod();
		Permission permission = method.getAnnotation(Permission.class); //得到控制器权限注解；
		User user=c.getSessionAttr("loginUser"); //从session中得到登录用户
		if(user==null){
			 c.renderFreeMarker("/login.html");
		}else{
			flag=permission==null?true:hasPermission(user,permission.value()); ///////<------------------
			//注意！如果一个页面调用多个控制器方法，如role.html (role/list,resource/list)
			//权限注解在页面上index()而不是控制器方法list()上，否则不能跳转到403，加载数据报错，原因不明。
			if(!flag){
				c.renderFreeMarker("/common/403.html");//为何不能跳转？
			}else{
        		invocation.invoke();
			}
		}
	}
	/**
	 * 权限验证
	 */
	public boolean hasPermission(User user,String permission){
		boolean flag=false;
		Set<String> permissions = Resource.dao.hasPermission(user.getId());
		for (String str : permissions) {
			System.out.println(str);
		}
		 if(permissions.contains(permission)){  //查到的权限数组是否包含注解权限
				flag=true;
			}
		return flag;
	}
}
